﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaActualizarDatos
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PActualizarDatos : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CActualizarDatos.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.Entrada, value);
            }
        }

        /// <summary>
        /// Salida de datos.
        /// </summary>
        public string Salida
        {
            get
            {
                return this.getPropiedadString(CActualizarDatos.Salida);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.Salida, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CActualizarDatos.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Estructura de salida.
        /// </summary>
        public string EstructuraSalida
        {
            get
            {
                return this.getPropiedadString(CActualizarDatos.EstructuraSalida);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.EstructuraSalida, value);
            }
        }

        /// <summary>
        /// Lista de tablas
        /// </summary>
        public List<string> ListaTablasDatos
        {
            get
            {
                return this.getPropiedadListaString(CActualizarDatos.ListaTablasDatos);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.ListaTablasDatos, value);
            }
        }

        /// <summary>
        /// Lista de estructuras de las tablas
        /// </summary>
        public List<string> ListaTablasEstructuras
        {
            get
            {
                return this.getPropiedadListaString(CActualizarDatos.ListaTablasEstructuras);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.ListaTablasEstructuras, value);
            }
        }

        /// <summary>
        /// Lista de campos clave de cada tabla
        /// </summary>
        public List<List<string>> ListaTablasCamposClaveTabla
        {
            get
            {
                return this.getPropiedadListaListaString(CActualizarDatos.ListaTablasCamposClaveTablas);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.ListaTablasCamposClaveTablas, value);
            }
        }

        /// <summary>
        /// Lista de campos clave del maestro para cada tabla
        /// </summary>
        public List<List<string>> ListaTablasCamposClaveMaestro
        {
            get
            {
                return this.getPropiedadListaListaString(CActualizarDatos.ListaTablasCamposClaveMaestro);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.ListaTablasCamposClaveMaestro, value);
            }
        }

        /// <summary>
        /// Lista de campos fuente de cada tabla
        /// </summary>
        public List<List<string>> ListaTablasCamposFuenteTabla
        {
            get
            {
                return this.getPropiedadListaListaString(CActualizarDatos.ListaTablasCamposFuenteTablas);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.ListaTablasCamposFuenteTablas, value);
            }
        }

        /// <summary>
        /// Lista de campos destino del maestro para cada tabla
        /// </summary>
        public List<List<string>> ListaTablasCamposDestinoMaestro
        {
            get
            {
                return this.getPropiedadListaListaString(CActualizarDatos.NodoTablasCamposDestinoMaestro);
            }
            set
            {
                this.setOrAddPropiedad(CActualizarDatos.NodoTablasCamposDestinoMaestro, value);
            }
        }


        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PActualizarDatos()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);
            this.Entrada = LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaEntrada);
            this.Salida = LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaSalida);
            this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaEstructuraEntrada);
            this.EstructuraSalida = LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaEstructuraSalida);
            
            int numeroTablas = LeerXml.ObtenerNumeroNodosCampo(xml, CActualizarDatos.RutaTablas);
            List<string> listaTablasDatos = new List<string>();
            List<string> listaTablasEstructuras = new List<string>();
            List<List<string>> listaTablasCamposClaveTabla = new List<List<string>>();
            List<List<string>> listaTablasCamposClaveMaestro = new List<List<string>>();
            List<List<string>> listaTablasCamposFuenteTabla = new List<List<string>>();
            List<List<string>> listaTablasCamposDestinoMaestro = new List<List<string>>();
                
            // Por cada tabla obtiene
            for (int indiceTabla = 0; indiceTabla < numeroTablas; indiceTabla++)
            {
                // Fichero de datos
                listaTablasDatos.Add(LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaTablas, indiceTabla, "./" + CActualizarDatos.NodoTablasDatos));

                // Fichero de estructuras
                string estructuraTabla = estructuraTabla = LeerXml.ObtenerValorCampo(xml, CActualizarDatos.RutaTablas, indiceTabla, "./" + CActualizarDatos.NodoTablasEstructuras);
                listaTablasEstructuras.Add(estructuraTabla);

                // Campos clave de la tabla
                List<string> camposClaveTabla = LeerXml.ObtenerListadoValorCampo(xml, CActualizarDatos.RutaTablas, CActualizarDatos.SeparadorListado, indiceTabla, CActualizarDatos.NodoTablasCamposClaveTabla);
                listaTablasCamposClaveTabla.Add(camposClaveTabla);

                // Campos clave de la entrada
                List<string> camposClaveMaestro = LeerXml.ObtenerListadoValorCampo(xml, CActualizarDatos.RutaTablas, CActualizarDatos.SeparadorListado, indiceTabla, CActualizarDatos.NodoTablasCamposClaveMaestro);
                listaTablasCamposClaveMaestro.Add(camposClaveMaestro);

                // Campos fuente de la tabla
                List<string> camposFuenteTabla = LeerXml.ObtenerListadoValorCampo(xml, CActualizarDatos.RutaTablas, CActualizarDatos.SeparadorListado, indiceTabla, CActualizarDatos.NodoTablasCamposFuenteTabla);
                listaTablasCamposFuenteTabla.Add(camposFuenteTabla);

                // Campos destino de la entrada
                List<string> camposDestinoMaestro = LeerXml.ObtenerListadoValorCampo(xml, CActualizarDatos.RutaTablas, CActualizarDatos.SeparadorListado, indiceTabla, CActualizarDatos.NodoTablasCamposDestinoMaestro);
                listaTablasCamposDestinoMaestro.Add(camposDestinoMaestro);

                // Comprobación listado campos
                if (camposClaveTabla.Count != camposClaveMaestro.Count)
                {
                    camposClaveMaestro = new List<string>();
                    camposClaveTabla = new List<string>();
                }
                if (camposFuenteTabla.Count != camposDestinoMaestro.Count)
                {
                    camposFuenteTabla = new List<string>();
                    camposDestinoMaestro = new List<string>();
                }
            }
                
            this.ListaTablasDatos = listaTablasDatos;
            this.ListaTablasEstructuras = listaTablasEstructuras;
            this.ListaTablasCamposClaveTabla = listaTablasCamposClaveTabla;
            this.ListaTablasCamposClaveMaestro = listaTablasCamposClaveMaestro;
            this.ListaTablasCamposFuenteTabla = listaTablasCamposFuenteTabla;
            this.ListaTablasCamposDestinoMaestro = listaTablasCamposDestinoMaestro;
        }
    }
}
